package com.example.toy.core;

import com.example.toy.ToySystemCache;
import com.example.toy.core.commit.ToyCommitAbstractFactory;
import com.example.toy.core.locker.ToyLockAbstractFactory;

/**
 * Toy超级工厂，负责创建其他有职责的工厂
 *
 * @author shenbing
 * @date 2021/12/22
 */
public interface ToySystemFactoryProducer {
  /**
   * 锁工厂， 实现类型可以基于文件锁、Zookeeper
   *
   * @return
   */
  ToyLockAbstractFactory buildLockFactory();

  /**
   * 提交历史工厂，实现类型可以基于文件或者数据库
   *
   * @return
   */
  ToyCommitAbstractFactory buildCommitFactory();

  /**
   * 获取默认的toy超级工厂。
   *
   * 注意：当存在多个ToySystem实例时，只会返回默认ToySystem的超级工厂
   *
   * @return
   */
  static ToySystemFactoryProducer getInstance() {
    return ToySystemCache.getDefaultSystem().getSystemFactoryProducer();
  }
}
